package com.luxsoft.siipap.em.replica.model;

import java.text.MessageFormat;

import org.apache.commons.lang.StringUtils;
import org.springframework.util.Assert;

/**
 * Abstraccion de un campo de dbf en siipap
 * 
 * @author Ruben Cancino
 *
 */
public class Campo implements Comparable<Campo>{
	
	private String nombre;
	private Object valor;
	private TipoDeCampo tipo;
	
	private enum TipoDeCampo{
		N,C,D
	}
	
	public Campo(String field) {
		String[] data=StringUtils.split(field,'?');
		Assert.isTrue(data.length==3,"El formato de campo es incorrecto formato: "+field);
		this.nombre = data[0];
		this.valor = data[1];
		setTipoAsString(data[2]);
	}
	
	
	public Campo(String nombre, Object valor, String tipo) {
		this.nombre = nombre;
		this.valor = valor;
		setTipoAsString(tipo);
	}

	public Campo(String nombre, Object valor, TipoDeCampo tipo) {
		this.nombre = nombre;
		this.valor = valor;
		this.tipo = tipo;
	}

	public String getNombre() {
		return nombre;
	}

	public void setNombre(String nombre) {
		this.nombre = nombre;
	}

	public TipoDeCampo getTipo() {
		return tipo;
	}
	public void setTipo(TipoDeCampo tipo) {
		this.tipo = tipo;
	}
	public void setTipoAsString(String tipoAsString){
		if("N".equalsIgnoreCase(tipoAsString)){
			setTipo(TipoDeCampo.N);
		}else if("D".equals(tipoAsString)){
			setTipo(TipoDeCampo.D);
		}else if("C".equals(tipoAsString)){
			setTipo(TipoDeCampo.C);
		}else
			throw new IllegalArgumentException("El argumento para definir el tipo de campo es incorrecto  valor suminstrado: "+tipoAsString);
	}

	public Object getValor() {
		return valor;
	}

	public void setValor(Object valor) {
		this.valor = valor;
	}
	
	public String toString(){
		String pattern="{0}={1} ({2})";
		return MessageFormat.format(pattern, this.nombre,this.valor,this.tipo);
	}


	public int compareTo(Campo o) {
		if(o==null) return 1;
		if(o==this) return 0;
		return getNombre().compareTo(o.getNombre());
	}


	@Override
	public int hashCode() {
		final int PRIME = 31;
		int result = 1;
		result = PRIME * result + ((nombre == null) ? 0 : nombre.hashCode());
		return result;
	}


	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		final Campo other = (Campo) obj;
		if (nombre == null) {
			if (other.nombre != null)
				return false;
		} else if (!nombre.equals(other.nombre))
			return false;
		return true;
	}
	
	
	
}
